μΉμ¬μ΄νΈ μ±λ₯ ν₯μμ μν΄ CSSλ₯Ό μ¬μ©ν μ§μ° λ‘λ© κ΅¬νμ λν μ’ ν© κ°μ΄λμ λλ€. λ€μν κΈ°μ , λͺ¨λ² μ¬λ‘ λ° μ€μ μ¬λ‘μ λν΄ μμ보μΈμ.
CSS μ§μ° κ·μΉ: μ±λ₯ ν₯μμ μν μ§μ° λ‘λ© κ΅¬ν
μ€λλ μ μΉ κ°λ° νκ²½μμ μΉμ¬μ΄νΈ μ±λ₯μ λ§€μ° μ€μν©λλ€. μ¬μ©μλ λΉ λ₯Έ λ‘λ© μκ°κ³Ό λΆλλ¬μ΄ νμ κ²½νμ κΈ°λν©λλ€. μ±λ₯ μ΅μ νλ₯Ό μν μ€μν κΈ°μ μ€ νλλ μ§μ° λ‘λ©μ λλ€. μ§μ° λ‘λ©μ νμν λκΉμ§(μΌλ°μ μΌλ‘ λ·°ν¬νΈμ λ€μ΄κ° λκΉμ§) μ€μνμ§ μμ 리μμ€μ λ‘λ©μ μ§μ°μν΅λλ€. JavaScript λΌμ΄λΈλ¬λ¦¬κ° μ ν΅μ μΌλ‘ μ§μ° λ‘λ©μ μ²λ¦¬νμ§λ§, μ΅μ CSSλ μ΅μνμ JavaScript λλ CSSλ§μΌλ‘ μ§μ° λ‘λ©μ ꡬνν μ μλ κ°λ ₯ν κΈ°λ₯μ μ 곡ν©λλ€.
μ§μ° λ‘λ©μ΄λ 무μμ΄λ©° μ μ€μνκ°μ?
μ§μ° λ‘λ©μ μ΄λ―Έμ§, λΉλμ€ λ° iframeκ³Ό κ°μ 리μμ€μ λ‘λ©μ μ€μ λ‘ νμν λκΉμ§ μ§μ°μν€λ μ±λ₯ μ΅μ ν κΈ°μ μ λλ€. λͺ¨λ μμ°μ 미리 λ‘λνλ λμ μ΄κΈ° λ·°ν¬νΈμ 보μ΄λ 리μμ€λ§ λ‘λλ©λλ€. μ¬μ©μκ° νμ΄μ§λ₯Ό μλλ‘ μ€ν¬λ‘€νλ©΄ λλ¨Έμ§ λ¦¬μμ€κ° μμ² μ λ‘λλ©λλ€. μ΄ μ κ·Ό λ°©μμ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- μ΄κΈ° νμ΄μ§ λ‘λ μκ° λ¨μΆ: μ΄κΈ° λ‘λ μ€μ μ μ‘λλ λ°μ΄ν° μμ μ€μμΌλ‘μ¨ νμ΄μ§κ° λ λΉ λ₯΄κ² μνΈ μμ©ν μ μκ² λ©λλ€.
- λμν μλΉ κ°μ: μ¬μ©μλ μ€μ λ‘ λ³΄λ 리μμ€λ§ λ€μ΄λ‘λνμ¬ λμνμ μ μ½νλ©°, νΉν λͺ¨λ°μΌ μ₯μΉμμ μ μ©ν©λλ€.
- μλ² λΉμ© μ κ°: λμν μ¬μ©λ κ°μλ μλ² λΉμ© μ κ°μΌλ‘ μ΄μ΄μ§λλ€.
- ν₯μλ μ¬μ©μ κ²½ν: λ‘λ© μκ°μ΄ λΉ¨λΌμ§λ©΄ λμ± λ°μμ±μ΄ λ°μ΄λκ³ μ¦κ±°μ΄ νμ κ²½νμ μ 곡ν©λλ€.
JavaScriptλ₯Ό μ¬μ©ν κΈ°μ‘΄ μ§μ° λ‘λ©
μμ¬μ μΌλ‘ μ§μ° λ‘λ©μ μ£Όλ‘ JavaScriptλ₯Ό μ¬μ©νμ¬ κ΅¬νλμμ΅λλ€. Vanilla Lazyload λ° Intersection Observer APIμ κ°μ μΈκΈ° μλ λΌμ΄λΈλ¬λ¦¬λ μμκ° νμλ μμ μ κ°μ§νκ³ κ·Έμ λ°λΌ μμλ₯Ό λ‘λνλ ν¨κ³Όμ μΈ λ°©λ²μ μ 곡ν©λλ€. JavaScript κΈ°λ° μ루μ μ κ°λ ₯νκ³ μ μ°νμ§λ§ νμ΄μ§μ μ 체 JavaScript νμ΄λ‘λμ μΆκ°λ©λλ€. λν μ¬μ©μ λΈλΌμ°μ μμ JavaScriptκ° νμ±νλμ΄ μμ΄μΌ ν©λλ€.
CSS κΈ°λ° μ§μ° λ‘λ©: νλμ μΈ μ κ·Ό λ°©μ
μ΅μ CSSλ μ΅μνμ JavaScript λλ JavaScript μμ΄ μ§μ° λ‘λ©μ ꡬνν μ μλ ν₯λ―Έλ‘μ΄ κ°λ₯μ±μ μ 곡ν©λλ€. μ΄ μ κ·Ό λ°©μμ content μμ±, :before/:after κ°μ μμ λ° μ»¨ν
μ΄λ 쿼리μ κ°μ CSS κΈ°λ₯μ νμ©νμ¬ ν¨μ¨μ μ΄κ³ μ°μν μ§μ° λ‘λ© μ루μ
μ μ 곡ν©λλ€.
CSS content μμ± λ° :before/:after κ°μ μμ
ν κ°μ§ κΈ°μ μ content μμ±μ :before λλ :after κ°μ μμμ ν¨κ» μ¬μ©νμ¬ μ리 νμμ μ΄λ―Έμ§ λλ λ‘λ© νμκΈ°λ₯Ό νμνλ κ²μ
λλ€. μ€μ μ΄λ―Έμ§λ μμκ° λ·°ν¬νΈμ μμ λ νΈλ¦¬κ±°λλ JavaScript λλ λ³λμ CSS κ·μΉμ μ¬μ©νμ¬ λ‘λλ©λλ€. μ΄ λ°©λ²μ κΈ°λ³Έμ μΈ ννμ μ§μ° λ‘λ©μ μ 곡νμ§λ§ λ€λ₯Έ μ κ·Ό λ°©μλ³΄λ€ ν¨μ¨μ±μ΄ λ¨μ΄μ§ μ μμ΅λλ€.
μ:
.lazy-image {
position: relative;
display: block;
width: 300px;
height: 200px;
background-color: #eee;
overflow: hidden;
}
.lazy-image::before {
content: 'Loading...';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.lazy-image img {
display: none; /* Initially hide the image */
}
/* JavaScript to add a class when in viewport */
.lazy-image.loaded img {
display: block; /* Show the image when loaded */
}
.lazy-image.loaded::before {
content: none; /* Remove the loading indicator */
}
μ΄ μμ λ JavaScriptκ° `loaded` ν΄λμ€λ₯Ό μΆκ°νμ¬ μ΄λ―Έμ§λ₯Ό νμν λκΉμ§ "Loading..." ν μ€νΈκ° μλ μ리 νμμλ₯Ό 보μ¬μ€λλ€.
CSS ν΄λμ€λ₯Ό μ¬μ©νλ Intersection Observer API
λ³΄λ€ κ°λ ₯ν μ κ·Ό λ°©μμ JavaScript Intersection Observer APIμ CSS ν΄λμ€λ₯Ό κ²°ν©νμ¬ λ¦¬μμ€λ₯Ό λμ μΌλ‘ λ‘λνλ κ²μ
λλ€. Intersection Observerλ μμκ° λ·°ν¬νΈμ λ€μ΄κ°κ±°λ λκ° λ μμλ₯Ό λͺ¨λν°λ§ν©λλ€. μμκ° νμλλ©΄ JavaScriptλ μμμ νΉμ ν΄λμ€(μ: loaded)λ₯Ό μΆκ°ν©λλ€. κ·Έλ° λ€μ CSS κ·μΉμ μ΄ ν΄λμ€λ₯Ό μ¬μ©νμ¬ μ€μ 리μμ€λ₯Ό λ‘λν©λλ€.
μ:
<img class="lazy" data-src="image.jpg" alt="Image description">
const lazyImages = document.querySelectorAll('.lazy');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.add('loaded');
observer.unobserve(img);
}
});
});
lazyImages.forEach(img => {
observer.observe(img);
});
.lazy {
opacity: 0; /* Initially hide the image */
transition: opacity 0.3s ease-in-out;
}
.lazy.loaded {
opacity: 1; /* Fade in the image when loaded */
}
μ΄ μμ λ JavaScript λ° CSSλ₯Ό μ¬μ©νλ κ°λ¨ν ꡬνμ 보μ¬μ€λλ€. JavaScript μ½λλ `.lazy` ν΄λμ€κ° λ·°μ λ€μ΄μ€λ κ²μ κ°μ§ν λ€μ μ΄λ―Έμ§λ₯Ό λ‘λν©λλ€.
컨ν μ΄λ 쿼리λ₯Ό μ¬μ©ν μμ CSS μ§μ° λ‘λ©(κ³ κΈ)
κ°μ₯ μ§λ³΄λ μ κ·Ό λ°©μμ CSS 컨ν
μ΄λ 쿼리λ₯Ό νμ©νμ¬ μ§μ μΌλ‘ JavaScriptκ° νμ μλ μ§μ° λ‘λ©μ μ μ¬λ ₯μ μ 곡ν©λλ€. 컨ν
μ΄λ 쿼리λ₯Ό μ¬μ©νλ©΄ λ·°ν¬νΈκ° μλ μμ μμμ ν¬κΈ° λλ μνλ₯Ό κΈ°λ°μΌλ‘ μ€νμΌμ μ μ©ν μ μμ΅λλ€. μ΄λ―Έμ§λ₯Ό 컨ν
μ΄λ λ΄μ λ°°μΉνκ³ μ»¨ν
μ΄λ 쿼리λ₯Ό μ¬μ©νμ¬ μ»¨ν
μ΄λκ° λ³΄μ΄λ μμ (μ: JavaScript λλ λ€λ₯Έ λ©μ»€λμ¦μ ν΅ν΄ display μμ±μ block λλ inline-blockμΌλ‘ μ€μ νμ¬)μ κ°μ§νλ©΄ CSSμμ μ 체μ μΌλ‘ μ΄λ―Έμ§ λ‘λ©μ νΈλ¦¬κ±°ν μ μμ΅λλ€.
κ°λ μ μ:
<div class="image-container">
<img src="placeholder.jpg" data-src="actual-image.jpg" alt="Image Description">
</div>
/* Define the container */
.image-container {
container-type: inline-size;
display: none; /* Initially hidden */
}
/* Show the image container using javascript based on some criteria */
.image-container.visible {
display: inline-block;
}
/* Define the image with the initial placeholder */
.image-container img {
content: url(placeholder.jpg); /* Placeholder image */
width: 100%;
height: auto;
}
/* Container Query to load the actual image */
@container image-container (inline-size > 0px) {
.image-container img {
content: url(attr(data-src)); /* Load the actual image */
}
}
μ€λͺ :
.image-containerλ μ²μμ μ¨κ²¨μ Έ μμ΅λλ€.- JavaScript(λλ λ€λ₯Έ λ©μ»€λμ¦)λ 컨ν
μ΄λλ₯Ό 보μ΄κ² λ§λλλ€(μ: λ·°ν¬νΈ κ·Όμ²μ μμ λ
.visibleν΄λμ€λ₯Ό μΆκ°). @containerκ·μΉμ 컨ν μ΄λμ ν¬κΈ°κ° 0λ³΄λ€ ν΄ λ(μ¦, 보μ΄λ κ²½μ°) νΈλ¦¬κ±°λ©λλ€.- μ΄λ―Έμ§μ
contentμμ±μdata-srcμμ±μ μ€μ μ΄λ―Έμ§ URLλ‘ μ λ°μ΄νΈλ©λλ€.
컨ν μ΄λ 쿼리 κΈ°λ° μ§μ° λ‘λ©μ λν μ€μν κ³ λ € μ¬ν:
- λΈλΌμ°μ μ§μ: λμ λΈλΌμ°μ κ° μ»¨ν μ΄λ 쿼리λ₯Ό μ§μνλμ§ νμΈν©λλ€. λΈλΌμ°μ μ§μμ΄ μ¦κ°νκ³ μμ§λ§ μ΄μ λΈλΌμ°μ μ λν λ체 κΈ°λ₯μ μ 곡νλ κ²μ΄ μ¬μ ν μ€μν©λλ€.
- μ κ·Όμ±: μ½ν μΈ λ₯Ό λμ μΌλ‘ λ‘λν λ μ΄μ κ³Ό ARIA μμ±μ μ μ νκ² κ΄λ¦¬νμ¬ μ κ·Όμ±μ μ μ§ν©λλ€.
- 볡μ‘μ±: 컨ν μ΄λ 쿼리λ₯Ό μ¬μ©ν μμ CSS μ§μ° λ‘λ©μ ꡬννλ κ²μ JavaScript κΈ°λ° μ루μ λ³΄λ€ λ 볡μ‘ν μ μμΌλ©° μ μ€ν κ³ν λ° ν μ€νΈκ° νμν©λλ€.
CSS μ§μ° λ‘λ©μ μν λͺ¨λ² μ¬λ‘
μ ννλ νΉμ κΈ°μ μ κ΄κ³μμ΄ CSS μ§μ° λ‘λ©μ ꡬνν λ μΌλμ λμ΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘κ° μμ΅λλ€.
- μ리 νμμ μ¬μ©: μ΄λ―Έμ§λ₯Ό λ‘λνλ λμ νμ μ΄λ―Έμ§ λ° κΈ°ν 리μμ€μ λν μ리 νμμλ₯Ό μ 곡ν©λλ€. μ΄λ κ² νλ©΄ μ½ν μΈ κ° μ΄λνλ κ²μ λ°©μ§νκ³ λ λμ μ¬μ©μ νκ²½μ μ 곡ν©λλ€. μ€μ μ΄λ―Έμ§μ νλ¦Ών λ²μ μ μ리 νμμλ‘ μ¬μ©νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ.
- μ΄λ―Έμ§ μ΅μ ν: μ΄λ―Έμ§μ νμ§μ μ νμν€μ§ μμΌλ©΄μ νμΌ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ μ΄λ―Έμ§κ° μΉμ μ ν©νκ² μ΅μ νλμλμ§ νμΈν©λλ€. TinyPNG λλ ImageOptimκ³Ό κ°μ λꡬλ₯Ό μ¬μ©νμΈμ.
- ν¬κΈ° μ€μ : λ‘λ μ€μ λ μ΄μμμ΄ λ³κ²½λλ κ²μ λ°©μ§νκΈ° μν΄ μ΄λ―Έμ§ λ° iframeμ λλΉ λ° λμ΄ μμ±μ νμ μ§μ ν©λλ€.
- μ€λ₯ μ²λ¦¬: 리μμ€ λ‘λμ μ€ν¨ν μν©μ μ μμ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ μ€λ₯ μ²λ¦¬λ₯Ό ꡬνν©λλ€.
- μ² μ ν ν μ€νΈ: λ€μν μ₯μΉ, λΈλΌμ°μ λ° λ€νΈμν¬ μ‘°κ±΄μμ μ§μ° λ‘λ© κ΅¬νμ ν μ€νΈνμ¬ μμλλ‘ μλνλμ§ νμΈν©λλ€. Google PageSpeed Insightsμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ κ°μ μ μΈ‘μ ν©λλ€.
- μ€μ 리μμ€ μ°μ μμ μ§μ : μ΅μμ μ΄κΈ° μ¬μ©μ κ²½νμ μ 곡νκΈ° μν΄ ν΄λ μμ μλ 리μμ€μ κ°μ μ€μ 리μμ€κ° μ κ·Ήμ μΌλ‘ λ‘λλλλ‘ ν©λλ€.
- λ체 κΈ°λ₯ κ³ λ €: μ¬μ© μ€μΈ νΉμ CSS κΈ°λ₯μ μ§μνμ§ μλ λΈλΌμ°μ μ λν λ체 λ©μ»€λμ¦μ μ 곡ν©λλ€.
μ€μ μ¬λ‘ λ° μ¬μ© μ¬λ‘
μ§μ° λ‘λ©μ κ΄λ²μν μΉμ¬μ΄νΈ λ° μ ν리μΌμ΄μ μ μ μ©ν μ μμ΅λλ€. μΌλ°μ μΈ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- μ μ μκ±°λ μΉμ¬μ΄νΈ: μΉ΄ν κ³ λ¦¬ λ° μ ν μμΈ νμ΄μ§μμ μ ν μ΄λ―Έμ§λ₯Ό μ§μ° λ‘λνμ¬ κ²μ μλλ₯Ό ν₯μμν΅λλ€.
- λΈλ‘κ·Έ μΉμ¬μ΄νΈ: λΈλ‘κ·Έ κ²μλ¬Όμμ μ΄λ―Έμ§μ μ½μ λ λΉλμ€λ₯Ό μ§μ° λ‘λνμ¬ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ μ€μ λλ€.
- μ΄λ―Έμ§ κ°€λ¬λ¦¬: μ΄λ―Έμ§ κ°€λ¬λ¦¬μμ μΈλ€μΌ λ° μ 체 ν¬κΈ° μ΄λ―Έμ§λ₯Ό μ§μ° λ‘λνμ¬ μ±λ₯μ ν₯μμν΅λλ€.
- λ΄μ€ μΉμ¬μ΄νΈ: λ΄μ€ κΈ°μ¬μμ μ΄λ―Έμ§ λ° κ΄κ³ λ₯Ό μ§μ° λ‘λνμ¬ νμ΄μ§ μλλ₯Ό ν₯μμν΅λλ€.
- λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA): SPAμμ κ΅¬μ± μμμ λͺ¨λμ μ§μ° λ‘λνμ¬ μ΄κΈ° λ²λ€ ν¬κΈ°λ₯Ό μ€μ λλ€.
μλ₯Ό λ€μ΄ μμ 곡μνμ νλ§€νλ κ΅μ μ μ μκ±°λ μΉμ¬μ΄νΈλ₯Ό μκ°ν΄ 보μΈμ. μ ν μ΄λ―Έμ§, νΉν λν κ°€λ¬λ¦¬μ νμλλ μ ν μ΄λ―Έμ§μ λν΄ μ§μ° λ‘λ©μ ꡬννλ©΄ μ μΈκ³ μ¬μ©μ, νΉν μΈν°λ· μ°κ²° μλκ° λλ¦° μ¬μ©μμ μΌν κ²½νμ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘ κΈλ‘λ² λ΄μ€ μΉμ¬μ΄νΈλ μ΄λ―Έμ§μ κ΄κ³ λ₯Ό μ§μ° λ‘λνμ¬ λ€μν μ§μμ λ μλ₯Ό μν΄ κΈ°μ¬λ₯Ό λΉ λ₯΄κ² λ‘λν μ μλλ‘ ν©λλ€.
κ²°λ‘
CSS μ§μ° λ‘λ©μ μΉμ¬μ΄νΈ μ±λ₯μ μ΅μ ννκ³ μ¬μ©μ νκ²½μ κ°μ νλ κ°λ ₯ν κΈ°μ μ
λλ€. JavaScript κΈ°λ° μ루μ
μ΄ μ ν΅μ μΈ μ κ·Ό λ°©μμ΄μμ§λ§ μ΅μ CSSλ μ΅μνμ JavaScript λλ JavaScript μμ΄ μ§μ° λ‘λ©μ ꡬνν μ μλ ν₯λ―Έλ‘μ΄ κ°λ₯μ±μ μ 곡ν©λλ€. content μμ±, :before/:after κ°μ μμ λ° μ»¨ν
μ΄λ 쿼리μ κ°μ CSS κΈ°λ₯μ νμ©νμ¬ κ°λ°μλ ν¨μ¨μ μ΄κ³ μ°μν μ§μ° λ‘λ© μ루μ
μ λ§λ€ μ μμ΅λλ€. λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ λΈλΌμ°μ μ§μ λ° μ κ·Όμ±μ μ μ€νκ² κ³ λ €νλ©΄ μΉμ¬μ΄νΈμ μ±λ₯μ ν¬κ² ν₯μμν€κ³ μ μΈκ³ μ¬μ©μμκ² λ λμ κ²μ νκ²½μ μ 곡ν μ μμ΅λλ€.
μΉ κΈ°μ μ΄ λ°μ ν¨μ λ°λΌ CSSλ μ±λ₯ μ΅μ νμμ μ μ λ μ€μν μν μ νκ³ μμ΅λλ€. CSS μ§μ° λ‘λ©μ μμ©νλ κ²μ κΈλ‘λ² λμμ μν΄ λ λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ©° μ¬μ©μ μΉνμ μΈ μΉμ¬μ΄νΈλ₯Ό ꡬμΆνκΈ° μν μ€μν λ¨κ³μ λλ€. μ£Όμ νμ§ λ§κ³ λ€μν κΈ°μ μ μ€ννκ³ μꡬ μ¬νμ κ°μ₯ μ ν©ν μ κ·Ό λ°©μμ μ°ΎμΌμΈμ. μ¦κ±°μ΄ μ½λ© λμΈμ!